package ultimaVersion;
import java.util.ArrayList;



public class Dispositivo{
	
	/** 
	 * Objeto puertoDispositivo recibe y trasmite los n bit el metodo transferir(int n)
	 */
	private GestorDePuertos puertoDispositivo;
	
	/** 
	 * Objeto memoDispositivo almacena los bytes
	 */
	private ControlDeMemoria memoDispositivo;
	
	/**
	 * El constructor crea los componentes del dispositivo
	 * */
	public Dispositivo() {
		super();
		this.puertoDispositivo = new PuertoSerie();
		this.memoDispositivo = new MemoriaDe8bits1Kb();
	}

	/** 
	 * Devuelve la cantidad de celdas usadas en la memoria
	 */
	public int getTotalUsado() {
		return this.memoDispositivo.celdasUsadas();
	}

	/**Agrega dato leido a la memoria
	 */
	public boolean addBufferEnMem(){
		this.memoDispositivo.setLectoEscritura(-1);
		boolean b = this.memoDispositivo.addBuffer(this.puertoDispositivo.getBuffer());
		this.memoDispositivo.cierraAcceso();
		return b;
	}

		
	/**Reescribe dato leido en memoria si no es una celda correcta
	 * no se graba el dato
	 */
	public boolean reescribContenidoDeCelda(int celda, ArrayList<Boolean> dato){
		if(this.memoDispositivo.setCelda(celda))
		this.memoDispositivo.setLectoEscritura(-1);
		boolean b = this.memoDispositivo.setContenidoDeLaCelda(dato);
		this.memoDispositivo.cierraAcceso();
		return b;
	}

	/**Habilita la ultima celda usada
	 */
	public void irAUltima(){
		this.setCeldaActual(memoDispositivo.celdasUsadas());
	}

	/**Se ubica a la memoria en la celda deseada
	 * */	
	public boolean setCeldaActual(int celda) {
		return memoDispositivo.setCelda(celda);
	}

	/**inicializa celda
	 */
	public void inicializaCelda(int celda){
		this.memoDispositivo.setLectoEscritura(-1);
		if(this.memoDispositivo.setCelda(celda))
		this.memoDispositivo.inicializaActual();
		this.memoDispositivo.cierraAcceso();
		}

		
	/**inicializa memoria
	 */
	public void inicializaMemoria(){
		this.memoDispositivo.inicializa();
	}
		
			
	/** 
	 * Extrae dato del puerto
	 */
	public boolean leePuertoDelDispositivo(long vel){
			this.puertoDispositivo.setEstado(1);
			this.puertoDispositivo.setVelocidadDeTransferencia(vel);
			boolean b = ((NormaRs232) this.puertoDispositivo).transferirBajoNorma(8);
			this.puertoDispositivo.cerrarTransferencia();
			return b;
		}
				
	/**
	 * Sube dato al puerto
	 */
	public boolean escribePuertoDelDispositivo(long vel){
		this.puertoDispositivo.setEstado(-1);
		this.puertoDispositivo.setVelocidadDeTransferencia(vel);
		boolean b = ((NormaRs232) this.puertoDispositivo).transferirBajoNorma(8);
		this.puertoDispositivo.cerrarTransferencia();
		return b;
	   }
	
	/**Muestra el dato de la celda actual
	 * */
	public boolean getContDeCeldaEnBuff() {
		return puertoDispositivo.setBuffer(this.memoDispositivo.getContenidoDeLaCelda());
	}
	
	/**muestra la memoria en pantalla
	 * */
	public void volcadoDeMemoria(){
		this.setCeldaActual(0);
		System.out.printf("Total de memoria usada: %d celdas de 8 bits",this.getTotalUsado());
		for(int i=0;i<this.getTotalUsado();i++){
			System.out.printf("\r\nDato %d:\r\n",i);
			this.setCeldaActual(i);
			this.getContDeCeldaEnBuff();
			for(int j=0;j<this.getBufferPuerto().size();j++)
				System.out.printf("  bit%d %b",j,this.getBufferPuerto().get(j));
			}
	}
	
	/**Muestra el contenido del buffer del puerto
	 * */
	public ArrayList<Boolean> getBufferPuerto() {
		return this.puertoDispositivo.getBuffer();
	}
}
